{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dropout\n",
    "\n",
    "Dropout是一种在训练深度神经网络时使用的正则化技术。它的主要目的是防止神经网络中的节点过度依赖于其他节点的输出，从而减少过拟合的风险。Dropout的工作原理是在训练过程中随机选择一些神经元（即节点）并暂时从网络中“丢弃”（即设置为不活跃状态），这意味着这些被选中的神经元不会对前向传播过程中的输入进行贡献，也不会参与梯度下降过程中的权重更新。\n",
    "\n",
    "具体来说，在使用Dropout时，每个神经元都有一个概率p（通常是小于1的一个值）在每次前向传播时被暂时关闭。这个概率是预先设定好的超参数。在测试阶段，所有神经元都被激活，但是它们的权重需要乘以1-p来校正训练期间由于部分神经元被关闭而导致的放大效应。\n",
    "\n",
    "Dropout技术可以看作是通过随机地改变网络结构来模拟集成学习的效果，因为每次前向传播实际上都是在训练一个不同的“子网络”。这些不同的子网络共享相同的权重集，因此训练过程可以视为同时训练多个模型，而最终的模型则是这些子模型的一种形式的平均。\n",
    "\n",
    "Dropout的应用场景通常包括但不限于以下几种情况：\n",
    "\n",
    "1. **图像识别**：在处理图像数据时，Dropout可以帮助模型更健壮地识别图像特征，因为它减少了单个神经元的重要性，使得模型更加关注全局信息而非局部细节。\n",
    "\n",
    "2. **自然语言处理**：对于文本数据，Dropout同样有助于防止过拟合，尤其是在处理长序列或复杂语义结构的情况下。\n",
    "\n",
    "3. **语音识别**：在处理音频信号时，Dropout可以提高模型对于不同音频模式的泛化能力。\n",
    "\n",
    "4. **推荐系统**：对于基于用户行为的数据，Dropout能够帮助模型更好地理解用户的偏好，并且减少对特定项目或用户行为的过度拟合。\n",
    "\n",
    "总的来说，Dropout是一种简单但非常有效的技术，用于增强神经网络的泛化性能，特别是在训练大型和复杂的深度学习模型时。然而，需要注意的是，虽然Dropout对于很多任务来说都有效果，但它并不是万能的，可能在某些特定情况下效果不佳，这时就需要尝试其他的正则化方法或者调整Dropout的概率等超参数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"https://img-blog.csdn.net/20151227174036199?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from IPython.display import Image\n",
    "Image(url= \"https://img-blog.csdn.net/20151227174036199?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://blog.csdn.net/amds123/article/details/69945787"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 图说dropout\n",
    "\n",
    "### 网络架构\n",
    "\n",
    "1. Linear(2,4) - 输入层到隐藏层\n",
    "2. ReLU 激活函数\n",
    "3. Dropout(0.5) - 第一个Dropout层，概率为0.5\n",
    "4. Linear(4,3) - 第二个隐藏层\n",
    "5. ReLU 激活函数\n",
    "6. Dropout(0.33) - 第二个Dropout层，概率为0.33\n",
    "7. Linear(3,2) - 输出层\n",
    "\n",
    "### 步骤详解\n",
    "\n",
    "🏋️ 训练\n",
    "\n",
    "[1] 给定：\n",
    "↳ 一个包含2个样例 \\(X_1, X_2\\) 的训练集。\n",
    "\n",
    "[2] 🟧 随机数：\\(p > 0.5\\)\n",
    "↳ 抽取4个随机数。\n",
    "↳ 对于每个随机数，如果它大于0.5，则保留并标记为 \\(◯\\)；否则丢弃并标记为 \\(╳\\)。\n",
    "↳ 结果是 \\([◯, ╳, ◯, ╳]\\)。\n",
    "\n",
    "[3] 🟧 Dropout：矩阵\n",
    "↳ 计算缩放因子：\\(1 / (1-p) = 2\\)。\n",
    "↳ 根据 \\([◯, ╳, ◯, ╳]\\) 设置对角线，其中 \\(◯ = 2\\) 且 \\(╳ = 0\\)。\n",
    "↳ 目的是丢弃第2个和第4个节点，并将剩余的两个节点缩放2倍。\n",
    "\n",
    "[4] 🟦 随机数：\\(p > 0.33\\)\n",
    "↳ 抽取3个随机数。\n",
    "↳ 对于每个随机数，如果它大于0.33，则保留并标记为 \\(◯\\)；否则丢弃并标记为 \\(╳\\)。\n",
    "↳ 结果是 \\([◯, ◯, ╳]\\)。\n",
    "\n",
    "[5] 🟦 Dropout：矩阵\n",
    "↳ 计算缩放因子：\\(1 / (1-p) = 1.5\\)。\n",
    "↳ 根据 \\([◯, ◯, ╳]\\) 设置对角线，其中 \\(◯ = 1.5\\) 且 \\(╳ = 0\\)。\n",
    "↳ 目的是丢弃第3个节点，并将剩余的两个节点缩放1.5倍。\n",
    "\n",
    "[6] 前向传播\n",
    "↳ 现在我们已经准备好了各层的所有矩阵，执行从前向后的前向传播过程，通过一系列矩阵乘法计算。\n",
    "↳ 在此过程中应用ReLU激活函数，将负特征值设置为零，标记为 \\(╳\\)。\n",
    "↳ 输出为 \\(Y\\)。\n",
    "\n",
    "[7] 🚩 MSE损失的梯度\n",
    "↳ 公式为 \\(2 * (Y - Y')\\)。\n",
    "↳ 首先我们计算输出 \\(Y\\) 和目标 \\(Y'\\) 之间的差值。\n",
    "↳ 接着将每个元素乘以2。\n",
    "\n",
    "[8] 更新权重\n",
    "↳ 使用损失梯度开始反向传播。\n",
    "↳ 更新一些权重（浅红色）。\n",
    "↳ 新权重的值仅用于演示目的，并非基于真实计算得出。\n",
    "\n",
    "🔍 推理\n",
    "\n",
    "[9] 禁用Dropout\n",
    "↳ 我们将两个Dropout矩阵设置为单位矩阵。\n",
    "↳ 效果是保留所有特征不变。\n",
    "\n",
    "[10] 前向传播\n",
    "↳ 进行前向传播以对未见过的数据做出预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<img src=\"dropout0.png\"/>"
      ],
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "Image(url= \"dropout0.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "torch24",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
